package com.duobaoyu.dby.supply.biz.service.order;

import cn.hutool.core.lang.Pair;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.duobaoyu.dby.channel.adapter.enums.biz.order.OrderStatusEnum;
import com.duobaoyu.dby.channel.boundary.bean.order.param.LogisticQueryParam;
import com.duobaoyu.dby.supply.biz.client.boundary.order.bean.bo.*;
import com.duobaoyu.dby.supply.biz.client.product.bean.bo.SkuInfoCheckBO;
import com.duobaoyu.dby.supply.common.biz.bo.order.*;
import com.duobaoyu.dby.supply.common.biz.dto.order.OrderPageDTO;
import com.duobaoyu.dby.supply.common.biz.dto.order.OrderStatisticsAmountDTO;
import com.duobaoyu.dby.supply.common.biz.remote.dto.order.SubmitOrderDTO;

import java.util.List;


/**
 * 订单逻辑
 *
 * @author fengshaoyu
 * @version 1.0.0
 * @date 2023/10/7 10:42
 */
public interface OrderService {

	/**
	 * 校验交易号是否存在
	 *
	 * @param bizTradeSn 业务交易号
	 * @param mchId      商户id
	 * @param serverName 实际业务请求方
	 * @return Boolean true 存在 false 不存在
	 */
	void tradeSnCheck(String bizTradeSn, String mchId, String serverName);

	/**
	 * 大额订单入库
	 * @param orderSplit 拆单数据
	 * @param submitOrder 业务订单数据
	 * @return String 业务单号
	 */
	String largeOrderSave(OrderSplitBO orderSplit,SubmitOrderDTO submitOrder);

	/**
	 * 确认订单数据校验
	 *
	 * @param orderStatusCheck 订单状态校验入参
	 * @return 校验通过返回订单数据
	 */
	List<OrderInfoBO> checkOrderStatus(OrderStatusCheckBO orderStatusCheck);

	/**
	 * 更新订单状态
	 *
	 * @param orderSnList   订单号集合
	 * @param desiredStatus 更新的状态
	 * @param currentStatus 当前状态
	 * @param source        操作来源
	 * @param description   操作描述
	 */
	void updateStatusByOrderSnList(List<String> orderSnList, OrderStatusEnum desiredStatus, OrderStatusEnum currentStatus, String source, String description,String failReason);

	/**
	 * 获取订单明细
	 *
	 * @param orderQueryIn 订单查询参数
	 */
	List<OrderBO> list(OrderQueryInBO orderQueryIn);

	/**
	 * 订单存储
	 * @param orderSubmit 提交订单
	 * @param submitOrder 商户订单数据
	 * @return String 存储
	 */
	String submitOrderSave(OrderSubmitBO orderSubmit,SubmitOrderDTO submitOrder);


	/**
	 * 同步三方订单信息
	 */
	void syncChannelOrderInfo(String orderSn);

	/**
	 * 售后取消订单
	 * @param orderSn 订单号
	 * @return Boolean
	 */
	Boolean afterSaleCancelOrder(String orderSn);

	/**
	 * 渠道确认是否完成
	 * @return true-已完成
	 */
    boolean channelConfirmCompleted(OrderInfoBO orderInfo);

	/**
	 * 分页查询订单列表信息
	 * @param orderPage 入参
	 * @return
	 */
	IPage<OrderListBO> queryOrderPage(OrderPageDTO orderPage);

	/**
	 * 获取订单信息集合
	 * @param orderQuery 入参
	 */
	List<OrderInfoBO> listOrderInfo(OrderQueryBO orderQuery);

	/**
	 * 获取订单列表导出信息
	 * @param orderPage 入参
	 */
	List<OrderExportBO> listOrderExportInfo(OrderPageDTO orderPage);

	/**
	 * 计数订单列表导出信息
	 * @param orderPage 入参
	 */
	int countOrderExportInfo(OrderPageDTO orderPage);


	/**
	 * 更新订单信息
	 * @param updateOrder
	 */
    boolean updateOrderByOrderSn(UpdateOrderBO updateOrder);

	/**
	 * 根据供应链三方订单交易号的基本订单数据
	 */
	OrderBO getBaseInfoByOrderTradeSn(String orderTradeSn);

	/**
	 * 统计订单金额
	 */
    List<OrderAmountStatisticsBO> statisticsAmount(OrderStatisticsAmountDTO orderStatisticsAmount);

	/**
	 * 保存拆单数据
	 * @param splitInfo key表示被拆的原订单,value表示拆分后的订单
	 */
	void saveSpiltOrder(Pair<OrderBO, List<OrderBO>> splitInfo);

	/**
	 * 校验充值账号参数
	 * @param submitOrder 提交订单入参
	 * @param skuInfoList 供应链商品信息
	 */
    void validRechargeAccount(SubmitOrderDTO submitOrder, List<SkuInfoCheckBO.SkuInfo> skuInfoList);

	/**
	 * 无物流订单
	 * @param page 页码
	 * @param pageSize 数据长度
	 * @return List<OrderInfoBO>
	 */
	List<OrderInfoBO> noLogisticsOrders(Integer page, Integer pageSize);

	/**
	 * 查询物流信息
	 * @param orderSnList 订单号
	 * @return List<LogisticQueryParam.ExpressInfo>
	 */
	List<LogisticQueryParam.ExpressInfo> getExpressInfo(List<String> orderSnList);
}
